Skip to main content

git fetch

1. 文档

基础命令:git fetch

官方文档地址:https://git-scm.com/docs/git-fetch

功能:用于从另一个远程仓库下载最新的对象和引用,但是不与本地分支进行合并。如果要查看下载下来的最新代码,可以在origin/xxx分支里查看。

区别:git fetch主要与git pull作对比,常说的一句话是git pull = git fetch + git merge。也就是说git fetch只是把最新代码更新到本地的origin/xxx分支,但是不会与本地的xxx分支进行代码合并,而git pull则是直接拉取最新代码并与本地的xxx分支进行代码合并。

2. 概念原理

2.1 FETCH_HEAD概念

指定某个branch在服务器上的最新状态。

~/workspace/github/git-study(dev ✔)cat .git/FETCH_HEAD
f715a6d5196fae48d0be4e5e163d3a35cc6f6bc1 branch 'dev' of git@github.com:aaaaaAndy/git-study.git

第一列是版本号,第二列是当前FETCH_HEAD将要被合并的本地分支,第三列是git版本库路径。

此时可以在dev分支直接执行git merge,即可将本地origin/dev分支的代码合并到dev分支上。

2.2 执行过程

get fetch的执行过程具体可分为两步:

  1. 创建并更新本地远程分支origin/xxx,即当不存在本地远程分支时先创建本地远程分支origin/xxx,然后将远程仓库代码更新到本地远程分支origin/xxx上;
  2. FETCH_HEAD中设定当前远程分支origin/xxx对应的本地分支,这样就可以直接执行git mergegit就会将远程分支origin/xxx上的更新合并到本地分支xxx上。

3. 基础命令

3.1 git fetch

获取远程所有分支更新到本地。

3.2 git fetch origin

获取某个远程主机的代码到本地,与git fetch功能相同,只是指定了要fetchremote

3.3 git fetch origin master

设定当前分支的 FETCH_HEAD为远程服务器的master分支。注意: 在这种情况下, 不会在本地创建本地远程分支, 这是因为:这个操作是git pull origin master的第一步, 而对应的pull操作,并不会在本地创建新的branch

一个附加效果是:这个命令可以用来测试远程主机的远程分支xxx是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常。

一般来说,我们本地都会存在存在origin/xxx分支,所以也并不需要创建一个新的origin/xxx分支。

3.4 git fetch origin master:temp

首先执行上面的fetch操作, 使用远程master分支在本地创建temp分支(但不会切换到该分支), 如果本地不存在temp分支, 则会自动创建一个新的temp分支, 如果本地存在temp分支, 并且是fast forward', 则自动合并两个分支, 否则, 会阻止以上操作。

3.5 git fetch origin :temp

等价于git fetch origin master:temp